//===========================================================================================================================
// Cuberry - http://www.cuberry.net
// Copyright (c) 2012
// by Peacequare® - Amir Moussa
//===========================================================================================================================
// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License 
// as published by the Free Software Foundation, either version 3 of the License, or any later version.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions 
// of the Software.
//
// This program is distributed in the hope that it will be useful.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//===========================================================================================================================

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using P2.Cuberry.Framework.Helper;
using Microsoft.Practices.Prism.Events;


namespace P2.Cuberry.Modules.SimpleAccounting.FiCheque
{
    /// <summary>
    /// Interaction logic for ChequesDetailsView.xaml
    /// </summary>
    public partial class FiChequesDetailsView : Window, IFiChequesDetailsView
    {

        public FiChequesDetailsView()
        {
            InitializeComponent();
        }


        public FiChequesDetailsPresentationModel Model
        {
            get { return this.DataContext as FiChequesDetailsPresentationModel; }
            set
            {                
                this.DataContext = value;
                //DDL++ sort
                this.CurrencyID.Items.SortDescriptions.Add(new  System.ComponentModel.SortDescription("XConfigCurrencyCur",  System.ComponentModel.ListSortDirection.Ascending));
              

            }
        }
        public event EventHandler<DataEventArgs<FiTransaction.BusinessEntities.FiTransactionHeader>> FiTransactionSelected = delegate { };
        public event EventHandler<DataEventArgs<FiTransaction.BusinessEntities.FiTransactionHeader>> FiTransactionOpened = delegate { };

        //private void FiTransactionsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        //{
        //    if (e.AddedItems.Count > 0)
        //    {
        //       FiTransaction.BusinessEntities.FiTransactionHeader selected = e.AddedItems[0] as  FiTransaction.BusinessEntities.FiTransactionHeader;
        //        if (selected != null)
        //        {
        //            FiTransactionSelected(this, new DataEventArgs<FiTransaction.BusinessEntities.FiTransactionHeader>(selected));
        //        }
        //    }
        //}
        //private void FiTransactionItemDebitList_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        //{
        //    try
        //    {
        //        DependencyObject dep = (DependencyObject)e.OriginalSource;
        //        while ((dep != null) && !(dep is System.Windows.Controls.DataGridRow))
        //        {
        //            dep = System.Windows.Media.VisualTreeHelper.GetParent(dep);
        //        }
        //        if (dep == null) return;
        //     string doc =    ((FiTransaction.BusinessEntities.FiTransactionHeader)FiTransactionItemDebitList.ItemContainerGenerator.ItemFromContainer(dep)).DocumentNo;
        //     FiTransaction.BusinessEntities.FiTransactionHeader item = FiTransaction.BusinessEntities.FiTransactionHeader.GetTransactionHeaderByDocNo(doc);
        //        // Do something with the item...
        //        if (item != null)
        //        {
        //            FiTransaction.BusinessEntities.FiTransactionHeader newItem = item.GetCopy();
        //            FiTransactionOpened(this, new DataEventArgs<P2.Cuberry.Modules.SimpleAccounting.FiTransaction.BusinessEntities.FiTransactionHeader>(item));
        //            //item.FillMyObject();
                  
        //            item.OnAllPropertiesChanged();
        //        }
        //    }
        //    catch (System.Exception ex) //AM:TC
        //    {
        //        P2ExceptionHandler.LogException(ex, string.Format("{0}.{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
        //    }
        //}

        private void FiTransactionItemDebitList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (FiTransactionItemDebitList.SelectedItem != null )
            {
                FiTransaction.BusinessEntities.FiTransactionItem selectedItem = (FiTransaction.BusinessEntities.FiTransactionItem)FiTransactionItemDebitList.SelectedItem;
                FiTransaction.BusinessEntities.FiTransactionHeader item = selectedItem.ParentFiTransaction;
                // Do something with the item...
                if (item != null)
                {

                    FiTransaction.BusinessEntities.FiTransactionHeader newItem = item.GetCopy();
                    Model.FiChequeOpenTransactionCommand.Execute(selectedItem.FiTransactionItemID);

                    //var checkEvent = eventAggregator.GetEvent<P2Event>();
                    //P2EventParameter eventPar = new P2EventParameter();
                    //eventPar.Name = "FiTransactionItem_OpenTransaction";
                    //eventPar.Parameters["FiTransactionItemID"] = selectedItem.FiTransactionItemID.ToString();
                    //checkEvent.Publish(eventPar);
                    //FiChequesDetailsPresentationModel obj;
                    //obj.FiChequeOpenTransactionCommand =




                }
            }
        }

        private IEventAggregator eventAggregator;

        
        private void FiTransactionItemCreditList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (FiTransactionItemCreditList.SelectedItem != null)
            {
                FiTransaction.BusinessEntities.FiTransactionItem selectedItem = (FiTransaction.BusinessEntities.FiTransactionItem)FiTransactionItemCreditList.SelectedItem;

                FiTransaction.BusinessEntities.FiTransactionHeader item = selectedItem.ParentFiTransaction;
                // Do something with the item...
                if (item != null)
                {

                    FiTransaction.BusinessEntities.FiTransactionHeader newItem = item.GetCopy();
                    Model.FiChequeOpenTransactionCommand.Execute(selectedItem.FiTransactionItemID);
                              
                    //var checkEvent = eventAggregator.GetEvent<P2Event>();
                    //P2EventParameter eventPar = new P2EventParameter();
                    //eventPar.Name = "FiTransactionItem_OpenTransaction";
                    //eventPar.Parameters["FiTransactionItemID"] = selectedItem.FiTransactionItemID.ToString();
                    //checkEvent.Publish(eventPar);
                    //FiChequesDetailsPresentationModel obj;
                    //obj.FiChequeOpenTransactionCommand =




                }
                //Model.EditTransactionItem(selectedItem, true);
            }
        }
       

        #region Standard DetailView Functionalities

        public void UpdateFocusedControl()
        {
            try
            {
                TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
                if (focusedTextBox == null)
                    return;
                
                BindingExpression textBindingExpr =
                  focusedTextBox.GetBindingExpression(TextBox.TextProperty);
                if (textBindingExpr == null)
                    return;

                textBindingExpr.UpdateSource();
            }
            catch (Exception)
            {
            }
        }


        private void SaveBtn_Click(object sender, RoutedEventArgs e)
        {
            UpdateFocusedControl();         
        }


        private void CloseBtn_Click(object sender, RoutedEventArgs e)
        {
            bool result = AskSave();
            if (result) this.Close();
        }                    
        
        private void PrintBtn_Click(object sender, RoutedEventArgs e)
        {

        }
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = !this.AskSave();
        }

        

        public bool AskSave()
        {
            UpdateFocusedControl();
            if (!Model.IsReadOnly && Model.ModelIsModified)
            {
                MessageBoxOptions opt = MessageBoxOptions.None;
                if (this.FlowDirection == FlowDirection.RightToLeft) opt = MessageBoxOptions.RtlReading;
                MessageBoxResult result = MessageBox.Show(P2Translator.GetResource("fiChequeNotSaved"), P2Translator.GetResource("ChequeNotSavedCaption"), MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation, MessageBoxResult.Cancel, opt);
                switch (result)
                {
                    case MessageBoxResult.Cancel:
                        break;
                    case MessageBoxResult.No:
                        return true;

                    case MessageBoxResult.Yes:
                        Model.Save();
                        if (StatusStrip.Status == "green")
                            return true;
                        break;
                    default:
                        break;
                }
                return false;
            }
            else
            {
                return true;
            }
        }


        public bool YellowStatusWarning(string MessageText, string CaptionText)
        {
            MessageBoxOptions opt = MessageBoxOptions.None;
            if (this.FlowDirection == FlowDirection.RightToLeft) opt = MessageBoxOptions.RtlReading;
            MessageBoxResult result = MessageBox.Show(MessageText, CaptionText, MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.Cancel, opt);

            switch (result)
            {
                case MessageBoxResult.Cancel:
                    break;

                case MessageBoxResult.No:
                    return false;
                    
                case MessageBoxResult.Yes:
                    return true;
                    
                default:
                    break;
            }
            return false;
        }

        #endregion

        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            this.FiTransactionItemCreditList.ItemsSource = this.Model.CreditTransactionItems;
            this.FiTransactionItemDebitList.ItemsSource = Model.DebitTransactionItems;
        }

        private void Amount_GotFocus(object sender, RoutedEventArgs e)
        {
            Amount.SelectAll();
        }

        private void SelectAll(object sender, MouseButtonEventArgs e)
        {

            TextBox tb = (sender as TextBox);

            if (tb == null)
            {
                return;
            }

            if (!tb.IsKeyboardFocusWithin)
            {
                tb.SelectAll();
                e.Handled = true;
                tb.Focus();
            }
        } 
    }
}
